package com.chujian.framework.core.base;


import com.chujian.framework.core.IId;
import com.chujian.framework.core.tsdata.Result;
import com.chujian.framework.util.WebUs;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 基础Controller 父类
 */
public abstract class BaseController<T extends IId> extends TsDataController {

    public abstract BaseService<T> getBaseService();

    /**
     * 通过ID查询数据
     *
     * @param id       id
     * @param needFull 是否需要填充数据
     * @return T
     */
    @GetMapping("/{id}")
    public Result<?> get(@PathVariable("id") Long id,
                         @RequestParam(value = "needFull", required = false, defaultValue = "true") Boolean needFull) {
        T data;
        if (needFull) {
            data = getBaseService().getByIdAndFull(id);
        } else {
            data = getBaseService().getById(id);
        }
        return okRs(data);
    }

    /**
     * 获取满足条件的列表数据
     *
     * @param data   参数
     * @param params 参数
     * @return List<T>
     */
    @GetMapping("/list")
    public Result<?> list(T data,
                          @RequestParam Map<String, String> params) {
        WebUs.prepareQueryData(data, params);
        List<T> list = getBaseService().listAndFull(data, params);
        return okRs(list);
    }

    /**
     * 获取满足条件的页数据，分页形式返回
     *
     * @param current 第几页
     * @param size    每页大小
     * @param data    参数
     * @param params  参数
     * @return Page<T>
     */
    @GetMapping("/page")
    public Result<?> page(@RequestParam("current") Integer current,
                          @RequestParam("size") Integer size,
                          T data,
                          @RequestParam Map<String, String> params) {
        WebUs.prepareQueryData(data, params);
        Object page = getBaseService().pageAndFull(current, size, data, params);
        return okRs(page);
    }

    /**
     * in方式获取数据
     *
     * @param ids ids
     * @return List<T>
     */
    @GetMapping("/in")
    public Result<?> in(@RequestParam("ids") Long[] ids) {
        List<T> list = getBaseService().inAndFull(Arrays.asList(ids));
        return okRs(list);
    }

    /**
     * 新增数据
     *
     * @param data data
     * @return 新增后的数据
     */
    @PostMapping()
    public Result<?> ins(@RequestBody T data) {
        data = getBaseService().ins(data);
        return okRs(data);
    }

    /**
     * 按ID修改数据
     *
     * @param data data
     * @return 修改后的数据
     */
    @PutMapping()
    public Result<?> upd(@RequestBody T data) {
        data = getBaseService().upd(data);
        return okRs(data);
    }

    /**
     * 删除数据
     *
     * @param id id
     * @return -
     */
    @DeleteMapping("/{id}")
    public Result<?> del(@PathVariable("id") Long id) {
        boolean del = getBaseService().del(id);
        return okRs(del);
    }

    /**
     * 批量删除数据
     *
     * @param ids ids
     * @return -
     */
    @DeleteMapping("/ids")
    public Result<?> dels(@RequestParam("ids") Long[] ids) {
        boolean del = getBaseService().dels(Arrays.asList(ids));
        return okRs(del);
    }


}
